<?php

/**
 * Green Calc
 * Calc Model for Calc Component
 * 2009-2014 All rights reserved
 * @link http://www.greenkey.ru
 * @license GNU/GPL v3
 */
// No direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.modeladmin');

/**
 * Calc Модель для формы по работе с расчетом
 *
 */
class CalcModelCalc extends JModelAdmin {

    /**
     * Возвращает ссылку на объект таблицы, всегда его создавая.
     *
     * @param   string  $type    Тип таблицы для подключения.
     * @param   string  $prefix  Префикс класса таблицы. Необязателен.
     * @param   array   $config  Конфигурационный массив. Необязателен.
     *
     * @return  JTable  Объект JTable.
     */
    public function getTable($type = 'Calc', $prefix = 'CalcTable', $config = array()) {
        return JTable::getInstance($type, $prefix, $config);
    }

    /**
     * Метод для получения формы.
     *
     * @param   array    $data      Данные для формы.
     * @param   boolean  $loadData  True, если форма загружает свои данные (по умолчанию), false если нет.
     *
     * @return  mixed  Объект JForm в случае успеха, в противном случае false.
     */
    public function getForm($data = array(), $loadData = true) {

        // Получаем форму.
        $form = $this->loadForm(
                $this->option . '.calc', 'calc', array('control' => 'jform', 'load_data' => $loadData)
        );

        if (empty($form)) {
            return false;
        }

        $id = JFactory::getApplication()->input->get('id', 0);
        $user = JFactory::getUser();

        // Изменяем форму исходя из доступов пользователя.
        if ($id != 0 && (!$user->authorise('core.edit.state', $this->option . '.calc.' . (int) $id)) || ($id == 0 && !$user->authorise('core.edit.state', $this->option))) {
            // Модифицируем поля.
            $form->setFieldAttribute('state', 'disabled', 'true');
        }

        return $form;
    }

    /**
     * Метод для получения значений предопределенных переменных.
     * 
     * @return Array Object со значениями переменных.
     */
    public function getVars() {
        $query = ' SELECT * FROM #__calc_vars';
        $this->_db->setQuery($query);
        $calc_vars = $this->_db->loadObjectList();
        return $calc_vars;
    }

    /**
     * Метод для получения скрипта, который будет включен в форму.
     * 
     * @return  string  Файл скрипта.
     */
    public function getScript() {
        return 'administrator/components/' . $this->option . '/models/forms/calc.js';
    }

    /**
     * Метод для получения данных, которые должны быть загружены в форму.
     * 
     * @return  mixed  Данные для формы.
     */
    protected function loadFormData() {
        // Проверка сессии на наличие ранее введеных в форму данных.
        $data = JFactory::getApplication()->getUserState($this->option . '.edit.calc.data', array());

        if (empty($data)) {
            $data = $this->getItem();
        }

        return $data;
    }

    /**
     * Метод для проверки, может ли пользователь удалять существующую запись.
     *
     * @param   object  $record  Объект записи.
     * 
     * @return  boolean  True, если разрешено удалять запись.
     */
    protected function canDelete($record) {
        if (!empty($record->id)) {
            return JFactory::getUser()->authorise('core.delete', $this->option . '.calc.' . (int) $record->id);
        } else {
            return parent::canDelete($record);
        }
    }

    /**
     * Метод для проверки, может ли пользователь изменять состояние записи.
     *
     * @param   object  $record  Объект записи.
     *
     * @return  boolean  True, если разрешено  изменять состояние записи.
     */
    protected function canEditState($record) {
        $user = JFactory::getUser();

        if (!empty($record->id)) {
            return $user->authorise('core.edit.state', $this->option . '.message.' . (int) $record->id);
        } else {
            return parent::canEditState($record);
        }
    }

    /**
     * Метод для сохранения предопределенных переменны в базу
     * 
     * @param type $data
     * 
     * @return  boolean  True, если успешно.
     */
    public function saveVars($data) {
        try {
            if ($data) {
                $query = 'TRUNCATE TABLE #__calc_vars';
                $this->_db->setQuery($query);
                $this->_db->query();

                foreach ($data as $v1) {
                    $msg .= $v1[1] . " - " . $v1[2] . "<br/>";
                    $query = 'INSERT INTO #__calc_vars (name, vvalues) VALUES ' .
                            "('" . $v1[1] . "', '" . $v1[2] . "')";
                    $this->_db->setQuery($query);
                    $this->_db->query();
                }
            }
            return true;
        } catch (Exception $e) {
            JFactory::getApplication()->enqueueMessage(JText::_('COM_CALC_ERROR_OCCURRED'), 'error');
            JLog::add($e->getMessage(), JLog::ERROR, 'com_calc');
        }
        return false;
    }

}
